<!DOCTYPE html>
<html>
    <head>
        <title>MediaSource.readyState equals "closed" test cases.</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_equals(mediaSource.sourceBuffers.length, 0, "sourceBuffers is empty");
              assert_equals(mediaSource.activeSourceBuffers.length, 0, "activeSourceBuffers is empty");
              assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
              assert_true(isNaN(mediaSource.duration), "duration is NaN");
          }, "Test attribute values on a closed MediaSource object.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.addSourceBuffer(MediaSourceUtil.VIDEO_ONLY_TYPE); },
                  "addSourceBuffer() throws an exception when closed.");
          }, "Test addSourceBuffer() while closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.sourceBuffers.length, 0, "sourceBuffers is empty");
                  assert_equals(mediaSource.activeSourceBuffers.length, 0, "activeSourceBuffers is empty");
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_throws("NotFoundError",
                      function() { mediaSource.removeSourceBuffer(sourceBuffer); },
                      "removeSourceBuffer() throws an exception when closed.");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test removeSourceBuffer() while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream(); },
                  "endOfStream() throws an exception when closed.");
          }, "Test endOfStream() while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream("decode"); },
                  "endOfStream(decode) throws an exception when closed.");
          }, "Test endOfStream(decode) while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.endOfStream("network"); },
                  "endOfStream(network) throws an exception when closed.");
          }, "Test endOfStream(network) while closed.");

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws("InvalidStateError",
                  function() { mediaSource.duration = 10; },
                  "Setting duration throws an exception when closed.");
          }, "Test setting duration while closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is 'open'");
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_throws("InvalidStateError",
                      function() { mediaSource.duration = 10; },
                      "Setting duration when closed throws an exception");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test setting duration while open->closed.");

           mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is 'open'");
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is 'closed'");
                  assert_true(isNaN(mediaSource.duration), "duration is NaN");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test getting duration while open->closed.");

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              assert_equals(mediaSource.readyState, "open", "readyState is open");

              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener("sourceclose", test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, "closed", "readyState is closed");
                  assert_throws("InvalidStateError",
                    function() { sourceBuffer.abort(); },
                    "sourceBuffer.abort() throws INVALID_STATE_ERROR");
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = "";
          }, "Test sourcebuffer.abort when closed.");

        </script>
    </body>
</html>
